package com.study.example.ex01;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileFilter;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FilenameFilter;
import java.io.IOException;

import org.junit.Test;

/**
* @Name: SingleDirCopyDemo
* @Description: 单级目录复制
* @Author: 李超	lc_jack@foxmail.com
* @CreateDate: 2017-1-16 上午11:00:03 
* @Version: V1.0
 */
public class SingleDirCopyDemo {
	
	/**
	* @Name: singleDirCopy
	* @Description: 单级目录复制练习一
	* 需求：将源目录下所有的文件复制到指定目录下
	* @Author: 李超	lc_jack@foxmail.com
	* @Version: V1.0
	* @CreateDate: 2017-1-16 上午11:02:32
	* @Parameters: @param original 源目录
	* @Parameters: @param target 目标目录
	* @Return: void 无
	 */
	public void singleDirCopy01(String original, String target) throws IOException{
		//获取源目录File对象
		File oDir = new File(original) ;
		//获取目标目录File对象
		File tDir = new File(target) ;
		//创建目标目录
		if(!tDir.exists()) {
			tDir.mkdirs() ;
		}
		//获取源目录中的所有文件对象集合
		File[] oDirFileList = oDir.listFiles() ;
		//文件拷贝
		for (File oFile : oDirFileList) {
			//获取源文件名称
			String fileName = oFile.getName() ;
			//获取源文件全路径
			String oFilePath = oFile.getAbsolutePath() ;
			//拼接目标文件全路径
			String tFilePath = target + "\\" + fileName ;
			//拷贝文件
			copyFile(oFilePath, tFilePath) ;
		}
	}
	
	/**
	* @Name: singleDirCopy02
	* @Description: 单级目录复制练习一
	* 需求：
	* 	将指定目录下以指定目录为后缀名结尾的文件拷贝到目标目录下，并修改源文件的后缀名以目标目录结尾
	* @Author: 李超	lc_jack@foxmail.com
	* @Version: V1.0
	* @CreateDate: 2017-1-16 上午11:38:17
	* @Parameters: @param original 源目录
	* @Parameters: @param target 目标目录
	* @Return: void
	 */
	public void singleDirCopy02(String original, String target) throws IOException {
		//获取源目录File对象
		File oDir = new File(original) ;
		//获取目标目录File对象
		File tDir = new File(target) ;
		//如果目标目录不存在，则创建
		if(!tDir.exists()) {
			tDir.mkdirs() ;
		}
		//获取源目录的名称
		final String oDirName = oDir.getName() ;
		//获取源目录下所有以源目录名为后缀的文件
		File[] oDirFileList = oDir.listFiles(new FilenameFilter() {
			@Override
			public boolean accept(File dir, String name) {
				return new File(dir, name).isFile() && name.endsWith("." + oDirName);
			}
		}) ;
		//拷贝到目标目录
		for (File oFile : oDirFileList) {
			//获取源文件全路径
			String oFilePath = oFile.getAbsolutePath() ;
			//拼接目标文件全路径：源文件名+目标文件夹后缀名
			String oFileName = oFile.getName() ;
			int indexOfOFileName = oFileName.indexOf(".") ;
			String oName = oFileName.substring(0, indexOfOFileName) ;
			String tDirName = tDir.getName() ;
			String tFilePath = target + "\\" + oName + "." + tDirName;
			//拷贝文件
			copyFile(oFilePath, tFilePath) ;
		}
	}
	
	@Test
	public void test02() {
		try {
			singleDirCopy02("D:\\jpg", "D:\\png") ;
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	
	/**
	* @Name: copyFile
	* @Description: 文件拷贝
	* 分析：源目录中包含文本文件、图片、视频等，使用字节流
	* @Author: 李超	lc_jack@foxmail.com
	* @Version: V1.0
	* @CreateDate: 2017-1-16 上午11:09:39
	* @Parameters: @param oFilePath 源文件全路径（包括文件名称）
	* @Parameters: @param tFilePath 目标文件全路径（包括文件名称）
	* @Return: void
	 */
	public void copyFile(String oFilePath, String tFilePath) throws IOException{
		BufferedInputStream bis = new BufferedInputStream(new FileInputStream(oFilePath)) ;
		BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(tFilePath)) ;
		//读取源文件数据：一次读取一个字节数组
		byte[] buf = new byte[1024] ;
		int len = 0;
		while((len = bis.read(buf)) != -1) {
			bos.write(buf, 0, len) ;
			bos.flush() ;
		}
		//释放资源
		bos.close() ;
		bis.close() ;
	}
	
	@Test
	public void test() {
		String original = "D:\\demo" ;
		String target = "D:\\test" ;
		try {
			singleDirCopy01(original, target) ;
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	
}


